✅clonee taskは繰り越さずに消したい
Tritaskに実装して使っていたのだけど、残ったclonee task(複製されたタスク)が次の日も残るのがちょっとうざいsta.icon
clonee taskは「常に」「その日にclone属性からつくる」という形に統一したい
実装
.
code:trita
2 2022/06/21 Tue task
2 2022/06/21 Tue task
3 2022/06/22 Wed task clone:0
↓
code:trita
2 2022/06/22 Wed task
2 2022/06/22 Wed task
2 2022/06/22 Wed task clone:0
この状態でtaskがclonee taskだと判定するには?
task clone:0から clone:0を抜いた文字列と一致するタスクがあるかどうか?
いや、一致判定の漏れとか出そうだし、故意に追加したtaskとの区別がつかない
まあ別に区別つけずに全部消せばいいけど
別案が目印つけること
code:trita
2 2022/06/21 Tue task clonee:1
2 2022/06/21 Tue task clonee:1
んー、属性にするのは気持ち悪いかsta.icon
タスク名は綺麗でいてほしい
とすると前者、判定頑張るしかないかー
---
clone:0の文字はどこにでも登場しうる
属性だから前後にはスペースがある
---
clone:0 →
clone:0 ★ → ★
★ clone:0 → ★
★ clone:0 ★ → ★ ★
いや関係ねえか、普通にreplaceで潰せばいいだけだsta.icon
アルゴリズム
ソート時、
1: 実行日が今日で、clone:0を持ってるタスクT1があったら、
2: T1のタスク名からreplace('clone:0', '')してタスク名TNをget
3: 実行日が今日で、タスク名がTNであるタスクをサーチ
4: 3を全部消す
が、実際はまず2:を全部getした後、それらをまとめて3+4するのがいいかsta.icon
副作用ないよね?
これの場合、
2 2022/06/21 Tue task clone:0
消えるのはこれ
2 2022/06/21 Tue task
---
いや、「明日に飛ばしたclone taskをまた今日に持ってきた場合」
この場合、「そのclone taskからつくられるタスク名」を持つタスクTはいったん全部消えるねsta.icon
いい?
いいか
リセットして一からつくろうという気になるし
そもそも「あー、あと2個ほしいわ」とかなったら、既存のTを普通にcopy taskすればいいんだし
消し漏れはありえる?
前日にタスク名をいじっていた場合
taskからtask / これ微妙やなぁみたいにコメント書いたとか
これは起きたらしゃーないsta.icon
---
code
ok
code:py
def apply_old_clonee_clearning(lines):
'''
1: 実行日が今日で、clone:0を持ってるタスクT1があったら、
2: T1のタスク名からreplace('clone:0', '')してタスク名TNをget
3: 実行日が今日で、タスク名がTNであるタスクをサーチ
4: 3を全部消す
先に2を一気に行って対象タスク名のリストを得る。
その後、「対象タスク名を含むタスクを消す処理」を通す。
まだ汎用性は無さそうなのでここでハードコード。
'''
target_tasknames_of_clonee = []
for i, line in enumerate(lines):
if line.find('clone:0') == -1:
continue
task = Task(line)
if not task.is_today():
continue
taskname = task.description
# clonee task の名前は、clone:0 が削除されたものに等しい
clonee_taskname = taskname.replace('clone:0','')
target_tasknames_of_clonee.append(clonee_taskname)
# lines から指定行を削除するのはムズいので、
# 削除対象行を全部取得した後、それらを remove() で一つずつ消す。
# (普通に実装すると index がずれていって狂うので、remove() など探索的な削除メソッドに頼る)
removee_lines = []
for i, line in enumerate(lines):
task = Task(line)
if not task.is_today():
continue
taskname = task.description
for clonee_taskname in target_tasknames_of_clonee:
if taskname==clonee_taskname:
removee_lines.append(line)
break
for removee_line in removee_lines:
lines.remove(removee_line)
diary
2022/06/21 18:52:49 破綻なさそうだし、少し寝かして、いけそうならもう実装しちゃお